﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DNADataHiding.Presenter;
using DNADataHiding.Presenter.ViewContracts;

namespace DNADataHiding
{
    public partial class MainForm : Form, IMainView
    {
        private readonly MainPresenter _mainPresenter ;

        public MainForm()
        {
            InitializeComponent();

            _mainPresenter = new MainPresenter(this);
            _mainPresenter.Init();
        }

        public void PopularMetodosEncriptacion(IDictionary<int, string> metodos)
        {
            cbMetodo.DataSource = new BindingSource(metodos, null);
            cbMetodo.DisplayMember = "Value";
            cbMetodo.ValueMember = "Key";

            cbDesencriptar_MetodoEncriptacion.DataSource = new BindingSource(metodos, null);
            cbDesencriptar_MetodoEncriptacion.DisplayMember = "Value";
            cbDesencriptar_MetodoEncriptacion.ValueMember = "Key";
        }

        public void PopularSecuenciasDeReferencia(IList<string> secuencias)
        {
            cbSecuencia.DataSource = new BindingSource(secuencias, null);
            cbDesenctriptar_SecuenciaReferencia.DataSource = new BindingSource(secuencias, null);
        }

        public int MetodoEncriptacion
        {
            get { return Convert.ToInt32(cbMetodo.SelectedValue); }
        }

        public string Secuencia
        {
            get { return Convert.ToString(cbSecuencia.SelectedValue); }
        }

        public int SemillaMensaje
        {
            get { return Convert.ToInt32(txtSemillaMensaje.Text); }
        }

        public int SemillaSecuencia
        {
            get { return Convert.ToInt32(txtSemillaSecuencia.Text); }
        }

        public string Mensaje
        {
            get { return txtMensaje.Text; }
        }

        public string Resultado
        {
            set { txtResultado.Text = value; }
        }

        private void btnEncriptar_Click(object sender, EventArgs e)
        {
            try
            {
                this.Cursor = Cursors.WaitCursor;

                this._mainPresenter.Encriptar();
            }
            finally
            {
                this.Cursor = Cursors.Default;
            }
        }

        private void cbMetodo_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (((KeyValuePair<int, string>)cbMetodo.SelectedItem).Key == 1)
            {
                lblSemillaMessage.Enabled = true;
                lblSemillaSecuencia.Enabled = true;
                txtSemillaMensaje.Enabled = true;
                txtSemillaSecuencia.Enabled = true;
            } 
            else
            {
                lblSemillaMessage.Enabled = false;
                lblSemillaSecuencia.Enabled = false;
                txtSemillaMensaje.Enabled = false;
                txtSemillaSecuencia.Enabled = false;
            }

            if (((KeyValuePair<int, string>)cbMetodo.SelectedItem).Key == 3)
            {
                lblLargoMayorEnc.Visible = true;
                txtLargoMayorEnc.Visible = true;
            }
            else
            {
                lblLargoMayorEnc.Visible = false;
                txtLargoMayorEnc.Visible = false;
            }
        }

        private void btnDesencriptar_Click(object sender, EventArgs e)
        {
            try
            {
                this.Cursor = Cursors.WaitCursor;

                this._mainPresenter.Desencriptar();
            }
            finally
            {
                this.Cursor = Cursors.Default;
            }
        }

        private void cbDesencriptar_MetodoEncriptacion_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (((KeyValuePair<int, string>)cbDesencriptar_MetodoEncriptacion.SelectedItem).Key == 1)
            {
                lblDesencriptar_SemillaMensaje.Enabled = true;
                lblDesencriptar_SemillaSecuencia.Enabled = true;
                txtDesencriptar_SemillaMensaje.Enabled = true;
                txtDesencriptar_SemillaSecuencia.Enabled = true;
            }
            else
            {
                lblDesencriptar_SemillaMensaje.Enabled = false;
                lblDesencriptar_SemillaSecuencia.Enabled = false;
                txtDesencriptar_SemillaMensaje.Enabled = false;
                txtDesencriptar_SemillaSecuencia.Enabled = false;
            }

            if (((KeyValuePair<int, string>)cbDesencriptar_MetodoEncriptacion.SelectedItem).Key == 3)
            {
                lblLargoMayorDes.Visible = true;
                txtLargoMayorDes.Visible = true;
            }
            else
            {
                lblLargoMayorDes.Visible = false;
                txtLargoMayorDes.Visible = false;
            }
        }
        
        public int MetodoDesencriptacion
        {
            get { return Convert.ToInt32(cbDesencriptar_MetodoEncriptacion.SelectedValue); }
        }

        public string SecuenciaReferenciaParaDesencriptar
        {
            get { return Convert.ToString(cbDesenctriptar_SecuenciaReferencia.SelectedValue); }
        }

        public int SemillaMensajeParaDesencriptar
        {
            get { return Convert.ToInt32(txtDesencriptar_SemillaMensaje.Text); }
        }

        public int SemillaSecuenciaParaDesencriptar
        {
            get { return Convert.ToInt32(txtDesencriptar_SemillaSecuencia.Text); }
        }

        public string MensajeDesencriptado
        {
            set { txtDesencriptar_Mensaje.Text = value; }
        }

        public string SecuenciaFalsaParaDesencriptar
        {
            get { return txtDesencriptar_FakeSequence.Text; }
        }
        
        public int LargoMayorParComplementario
        {
            set
            {
                this.txtLargoMayorEnc.Text = value.ToString();
            }
        }

        public int LargoMayorParComplementarioParaDesencriptar
        {
            get
            {
                return Convert.ToInt32(this.txtLargoMayorDes.Text);
            }
        }

        public void MostrarMensajeError(string msg)
        {
            MessageBox.Show(msg, "Error");
        }
    }
}
